package com.feimaopian.config;

import com.auth0.jwt.interfaces.DecodedJWT;
import com.feimaopian.entity.JwtToken;
import com.feimaopian.service.UserServiceImpl;
import com.feimaopian.utils.JwtUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

public class JwtRealm extends AuthorizingRealm {
    @Autowired
    private UserServiceImpl userService;

    /*
     * 多重写一个support
     * 标识这个Realm是专门用来验证JwtToken
     * 不负责验证其他的token（UsernamePasswordToken）
     * */
    @Override
    public boolean supports(AuthenticationToken token) {
        //这个token就是从JWTFilter过滤器中传入的jwtToken
        return token instanceof JwtToken;
    }

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //根据业务自行授权
        return null;
    }

    //认证
    //这个token就是从过滤器中传入的token
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        String jwt = (String) token.getPrincipal();
        if (jwt == null) {
            throw new NullPointerException("token 不允许为空");
        }

        //判断
        if (!JwtUtils.verify(jwt)) {//判断token是否正确
            throw new UnknownAccountException();
        }


/*        //下面是验证这个admin是否是真实存在的
        DecodedJWT decodedJWT = JwtUtils.getToken(jwt);//解析token
        String username = decodedJWT.getClaim("username").asString();//判断数据库中username是否存在*/


        return new SimpleAuthenticationInfo(jwt,jwt,getName());
        //这里返回的是类似账号密码的东西，但是jwtToken都是jwt字符串。不需要进行账号密码的比对，因为上面对token已经进行判断了，token被修改了是无法进入的
    }
}

